module.exports = (options, app) => {
  return async function jwtMiddleware(ctx, next) {
    // 获取请求头中的 Authorization 字段，通常包含 JWT Token
    const token = ctx.request.header.authorization;
    // 不用token的列表
    const whiteList = [
      "/api/login",
      "/api/upload/image",
      "/api/upload/editorImage",
      "/api/upload/image/:filename",
    ];
    // 跳过swagger的路径验证
    if (ctx.path.indexOf("swagger") > -1 || ctx.path.indexOf("favicon") > -1) {
      await next();
      return;
    }
    app.logger.info(ctx.path);
    // 如果没有提供 Token，返回 401 错误
    if (!token && whiteList.indexOf(ctx.path) === -1) {
      ctx.status = 200;
      ctx.body = { code: 401, message: "会话过期，请重新登录" };
      return;
    }

    if (token && whiteList.indexOf(ctx.path) === -1) {
      // 检查 token 是否在黑名单中
      const isBlacklisted = await app.redis.get(
        `jwt:blacklist:${token.replace("Bearer ", "")}`
      );
      if (isBlacklisted) {
        ctx.status = 200;
        ctx.body = { code: 401, message: "会话过期，请重新登录" };
        return;
      }
    }

    if (token) {
      // 验证 JWT Token
      // 将解码后的用户信息挂载到 ctx.state.user 中，以便后续路由使用
      let decoded;
      try {
        decoded = app.jwt.verify(
          token.split("Bearer ")[1],
          app.config.jwt.secret
        );
      } catch (err) {
        if (err.name === "TokenExpiredError") {
          ctx.status = 200;
          ctx.body = {
            code: 401,
            message: "Token 已过期",
            errorType: "token_expired",
          };
          return;
        }

        ctx.status = 200;
        ctx.body = {
          code: 401,
          message: "无效 Token",
          errorType: "invalid_token",
        };
        return;
      }
      ctx.state.userInfo = decoded;
    }

    // 继续执行下一个中间件或路由处理函数
    await next();
  };
};
